package main

import "fmt"

/*
	Go 的select 语句

select 是Go中的一个控制结构，类似于通信的switch 语句 ，每个 case 必须是一个通信操作
要么是发送，要么是接收。

select 随机执行一个可运行的case ，如果没有case 可运行，它将阻塞，直到有case 可运行，
一个默认的自己总是可以执行的

select 的语法描述，

	1.每个case都必须是一个通信
	2.所有channel表达式都会被求值
	3.所有被发送的表达式都会被求值
	4.如果任意某个通信可以进行，它就执行，其他被忽略
	5.如果有多个case都可以运行，Select 会随机公平的选出一个执行，其他不会执行
	否则：
		如果有default 子句，则执行该语句。
		如果没有default 子句，select 将阻塞，直到某个通信可以运行，Go不会重新对channel或值进行求值。
*/
func main() {
	var c1, c2, c3 chan int
	var i1, i2 int
	select {
	case i1 = <-c1:
		fmt.Printf("received ", i1, " from c1\n")
	case c2 <- i2:
		fmt.Printf("sent ", i2, " to c2\n")
	case i3, ok := (<-c3): // same as: i3, ok := <-c3
		if ok {
			fmt.Printf("received ", i3, " from c3\n")
		} else {
			fmt.Printf("c3 is closed\n")
		}
	default:
		fmt.Printf("no communication\n")
	}

}
